package com.gongenbo.utils;


import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 小年糕编程题，用java实现version compare函数及测试用例，目标是做成库给外部开发者用，对任意软件的版本号做比较，
 * 输入参数为两个版本号。function versionCompare(v1, v2)，v1、v2是任意软件的两个版本号，比较其大小关系。不得
 * 使用现成的版本比较库函数。请涵盖常用的软件版本号格式，重点考察异常情况处理。
 * Created by gongenbo on 2017/6/4.
 */
public class VersionCompare {
    /**
     * 版本阶段
     */
    private static Map verPhase=new HashMap();
    static{
        verPhase.put("base",1);
        verPhase.put("alpha",2);
        verPhase.put("beta",3);
        verPhase.put("rc",4);
        verPhase.put("release",5);
    }
    /**
     * 版本比较函数
     * @param v1
     * @param v2
     * @return v1>v2=>+ v1<v2=>- v1=v2=>0
     * @throws Exception
     */
    public static int versionCompare(String v1, String v2) throws Exception {
        if(v1==null||v2==null){
            throw new Exception("version str is null");
        }
        if(v1.equals(v2)){
            return 0;
        }
        //按照. - _分割字符串
        String[] arrV1=v1.split("(\\.|_|-){1}");
        String[] arrV2=v2.split("(\\.|_|-){1}");
        int idx = 0;
        int minLength = Math.min(arrV1.length, arrV1.length);//取最小长度值
        int diff = 0;
        while (idx < minLength
                && (diff = arrV1[idx].length() - arrV2[idx].length()) == 0//先比较长度
                && (diff = arrV1[idx].compareTo(arrV2[idx])) == 0) {//再比较字符
            if((idx==minLength-1)&&isWord(arrV1[idx])&&isWord(arrV2[idx])){

            }
            ++idx;
        }
        /*
        if(){

        }*/
        //如果已经分出大小，则直接返回，如果未分出大小，则再比较位数，有子版本的为大；
        diff = (diff != 0) ? diff : arrV1.length - arrV2.length;
        return diff;
    }
    /**
     * 判断是否为数字
     * @param str
     * @return
     */
    public static boolean isNumeric(String str){
        Pattern pattern = Pattern.compile("[0-9]*");
        return pattern.matcher(str).matches();
    }
    /**
     * 判断是否为单词
     * @param str
     * @return
     */
    public static boolean isWord(String str){
        Pattern pattern = Pattern.compile("[a-zA-Z]*");
        return pattern.matcher(str).matches();
    }
    public static void main(String[] args){
        //1.1.1.20170604_beta
        String v1="1.1.1.20170604_base";
        String v2="1.1.1.20170604_alpha";
        try {
            int ret = versionCompare(v1, v2);
            System.out.println(ret);
        }catch(Exception e){
            e.printStackTrace();
        }
        String[] arrV1=v1.split("(\\.|_|-){1}");
        System.out.println("v1 len:"+arrV1.length+"v1 5:"+arrV1[4]);
        System.out.println("isWord:"+isWord("abc")+":..."+isWord("123"));
    }
}

